请教"i++"的问题

来源:百度知道 编辑:UC知道 时间:2024/06/24 13:29:15
这是条填空题:
以下程序的输出结果是。

main()

{int s,i;

for(s=0,i=1;i<3;i++,s+=i);

printf("%d\n",s);

}
答案是5,可是我只算得3,请高人指点一下
我想问:"i++","s+=i";是先执行那句啊??

准备知识:
逗号运算符","也叫顺序求值运算符,运算优先级15是最低的,结合方向为自左向右(即:先执行左边的表达式,再执行右边的表达式).逗号运算符的左边总是不返回的,也就是说逗号右边的值才识整个表达式的值.

例如逗号表达式: y=(x=10,x+5) 和 y=(x=10,(y=x+5,x=x+10))
你知道他们分别运行后的x和y各是多少吗?
对于第一个逗号表达式: x=10 , y=15
解释为:先执行x=10,再执行x+5,且将x+5的值15作为逗号表达式式的值,最后赋值给y=15.
也就是说:y=(x=10,x+5) 可以分解为(或者说等同): x=10; y=x+5;

对于第一个逗号表达式: x=20 , y=1
解释为: 先执行x=10,再执行右边逗号表达式,其中先y=x+5,后x=x+10(即x=20), 且表达式x=x+10的逻辑值 1 做为右边逗号表达式(y=x+5,x=x+10)的值,最后执行y=1; ([顺便聊聊: ******你说说,右边表达式的值为多少? 20? 15? 不知道? 让我来告诉你吧! 右边表达式的值为1,因为赋值表达式逻辑值为真(即:(x=x+10)==1).而逗号右边的值才识整个表达式的值,那么可得(y=x+5,x=x+10)==(y=x+5,1)==1 了. 那么外围的逗号表达式的值,也为 (x=10,(y=x+5,x=x+10))==(x=10,1)==1 了. 最后执行的是y=1;******])
也就是说:y=(x=10,(y=x+5,x=x+10)) 可以分解为(或者说等同):x=10;;y=x+5,y=(x=x+10);

你看懂 逗号表达式 了吗?不懂?再看一遍,还是不懂?那就别看了或者啃教科书去吧.

现在来看看问题:
for(s=0,i=1;i<3;i++,s+=i) 里面有两个逗号表达式s=0,i=1和i++,s+=i 他们个自的执行顺序你知道了吗? 不知道我再说最后一次:顺序自左向右.

下面来做等价转换:
fo